// 导入 MySQL 模块
// const mysql = require("mysql");
// const util = require("../../common/util");
// const config = require("../../common/config");

// 创建 MySQL 连接池
// const pool = mysql.createPool(config.dbConfig);
const pool = require("../../common/util");

class AddressDB {
  /**
   * @constructor
   * @private
   */
  constructor() {
    this.instance = null;
    this.pool = pool;
  }

  /**
   * 创建 AddressDB 对象
   * @returns { AddressDB}  AddressDB 实例
   */
  static getInstance() {
    if (!this.instance) {
      this.instance = new AddressDB();
    }
    return this.instance;
  }
}

/**
 * 添加地址
 * @param {Object} address 地址对象
 * @returns {Promise}  Promise 对象
 */
AddressDB.prototype.add = async function (address) {
  try {
    // 构造插入地址的 SQL 语句
    let sql = "INSERT INTO addresses(user_id, name, address_line1, address_line2, city, state_province, postal_code, country, phone_number) VALUES(?,?,?,?,?,?,?,?,?)";
    // 提取地址对象中的参数
    let params = [
      address.userId,
      address.name,
      address.addressLine1,
      address.addressLine2,
      address.city,
      address.stateProvince,
      address.postalCode,
      address.country,
      address.phoneNumber
    ];

    // 使用 query 函数执行 SQL 插入操作
    let result = await this.pool.query(sql, params);

    // 返回结果
    return result.affectedRows;
  } catch (err) {
    // 在出现错误时抛出异常
    throw err;
  }
}

/**
 * 查找指定地址的信息
 * @param {Object} address
 * @returns 
 */
AddressDB.prototype.find =async function (address) {
  try{
    let sql = "select * from addresses where id = ? AND user_id = ?";
    let params = [
      address.addressId,
      address.userId ];
    const result = this.pool.query(sql, params);
    return result;

  }catch(err){
    throw err;
  }
}

/**
* 获取地址列表
* @param {Number} [limit=-1] 数量限制
* @param {Number} [offset=-1] 分页偏移
* @returns {Promise<Array<Object>>} 物品列表
*/
AddressDB.prototype.findAll = async function (limit = -1, offset = -1) {
  try {
      // 构造查询物品列表的 SQL 语句
      let sql = "SELECT * FROM addresses ORDER BY id";
      let params = [];
      if (limit !== -1) {
          sql += " LIMIT ?";
          params.push(limit);

          if (offset !== -1) {
              sql += " OFFSET ?";
              params.push(offset);
          }
      }

      // 使用 query 函数执行 SQL 查询操作
      let result = await this.pool.query(sql, params);

      // 返回查询结果
      return result;
  } catch (err) {
      // 在出现错误时抛出异常
      throw err;
  }
};

/**
* 获取地址列表
* @param {Number} [limit=-1] 数量限制
* @param {Number} [offset=-1] 分页偏移
* @returns {Promise<Array<Object>>} 物品列表
*/
AddressDB.prototype.findAllSelf = async function (limit = -1, offset = -1,id) {
  try {
      // 构造查询物品列表的 SQL 语句
      let sql = "SELECT * FROM addresses WHERE user_id = ? ORDER BY id";
      let params = [id];
      if (limit !== -1) {
          sql += " LIMIT ?";
          params.push(limit);

          if (offset !== -1) {
              sql += " OFFSET ?";
              params.push(offset);
          }
      }

      // 使用 query 函数执行 SQL 查询操作
      let result = await this.pool.query(sql, params);

      // 返回查询结果
      return result;
  } catch (err) {
      // 在出现错误时抛出异常
      throw err;
  }
};

/**
 * 删除地址
 * @param {Number} addressId 地址ID
 * @returns {Promise}  Promise 对象
 */
/**
 * 删除地址
 * @param {Object} address 包含地址ID和用户ID的对象
 * @returns {Promise} Promise 对象
 */
AddressDB.prototype.remove = async function (address) {
  try {
    // 构造删除地址的 SQL 语句
    let sql = "DELETE FROM addresses WHERE id = ? AND user_id = ?";
    // 提取地址对象中的参数
    let params = [address.addressId, address.userId];

    // 使用 query 函数执行 SQL 删除操作
    let result = await this.pool.query(sql, params);

    // 检查是否有受影响的行
    if (result.affectedRows === 0) {
      throw new Error("删除失败，可能是因为地址不存在或用户ID不匹配");
    }

    // 返回结果
    return result;
  } catch (err) {
    // 在出现错误时抛出异常
    throw err;
  }
}


/**
 * 更新地址
 * @param {Object} address 包含地址ID和用户ID的对象
 * @returns {Promise} Promise 对象
 */
AddressDB.prototype.update = async function (address) {
  try {
    // 构造更新地址的 SQL 语句
    let sql = "UPDATE addresses SET name = ?, address_line1 = ?, address_line2 = ?, city = ?, state_province = ?, postal_code = ?, country = ?, phone_number = ? WHERE id = ? AND user_id = ?";
    // 提取地址对象中的参数
    let params = [
      address.name,
      address.addressLine1,
      address.addressLine2,
      address.city,
      address.stateProvince,
      address.postalCode,
      address.country,
      address.phoneNumber,
      address.addressId,
      address.userId
    ];

    // 使用 query 函数执行 SQL 更新操作
    let result = await this.pool.query(sql, params);

    // 检查是否有受影响的行
    if (result.affectedRows === 0) {
      throw new Error("更新失败，没有找到匹配的记录");
    }

    // 返回受影响的行数
    return result.changedRows;
  } catch (err) {
    // 在出现错误时抛出异常
    throw err;
  }
}


/**  
 * 设置默认地址  
 * @param {Object} address - 包含 addressId 和 userId 的对象  
 * @returns {Promise<Object>} - 包含操作结果的 Promise 对象  
 */  
AddressDB.prototype.setDefaultAddress = async function (address) {  
  try {  
    // 验证地址是否存在并属于当前用户  
    const checkAddressSql = "SELECT COUNT(*) AS count FROM addresses WHERE id = ? AND user_id = ?";  
    const checkAddressParams = [address.addressId, address.userId];  
    const checkAddressResult = await this.pool.query(checkAddressSql, checkAddressParams);  
      
    if (checkAddressResult[0].count === 0) {  
      // 地址不存在或不属于当前用户  
      throw new Error('地址不存在或不属于当前用户');  
    }  
  
    // 设置默认地址的 SQL 语句  
    const setDefaultSql = "UPDATE addresses SET is_default = 1 WHERE id = ? AND user_id = ?";  
    const setDefaultParams = [address.addressId, address.userId];  
  
    // 更新默认地址  
    const updateDefaultResult = await this.pool.query(setDefaultSql, setDefaultParams);  
  
    // 更新其他地址为非默认的 SQL 语句  
    const updateOtherSql = "UPDATE addresses SET is_default = 0 WHERE user_id = ? AND id != ?";  
    const updateOtherParams = [address.userId, address.addressId];  
  
    // 更新其他地址为非默认  
    const updateOtherResult = await this.pool.query(updateOtherSql, updateOtherParams);  
  
    // 返回操作结果  
    return {  
      success: true,  
      defaultAddressSet: updateDefaultResult.affectedRows > 0,  
      otherAddressesUpdated: updateOtherResult.affectedRows > 0,  
    };  
  } catch (err) {  
    // 如果有错误，返回带有错误信息的对象  
    return {  
      success: false,  
      defaultAddressSet: false,  
      otherAddressesUpdated: false,  
      error: err.message || err.toString(),  
    };  
  }  
};


module.exports = AddressDB;